package com.quan.sdk.weixin.tools;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.quan.sdk.weixin.common.WeixinContext;
import com.quan.sdk.weixin.common.utils.WeixinUtil;
import com.quan.sdk.weixin.model.Media;

/**
 * 公众号素材工具类
 * @author yhaoquan
 *
 */
public class MediaTools {
	
	private static Logger logger = LoggerFactory.getLogger(MediaTools.class);
	
	/**
	 * 新增其他类型永久素材
	 * <br>方式：POST
	 * <br>参数：
	 * <br>&nbsp;&nbsp;&nbsp; access_token 调用接口凭证
	 * <br>&nbsp;&nbsp;&nbsp; type 媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb） 
	 * <br>&nbsp;&nbsp;&nbsp; media form-data中媒体文件标识，有filename、filelength、content-type等信息
	 * <br>&nbsp;&nbsp;&nbsp; 注意：在上传视频素材时需要POST另一个表单，id为description，包含素材的描述信息，内容格式为JSON，格式如下：
	 * <br>&nbsp;&nbsp;&nbsp; {
	 * <br>&nbsp;&nbsp;&nbsp; "title":VIDEO_TITLE,
	 * <br>&nbsp;&nbsp;&nbsp; "introduction":INTRODUCTION
	 * <br>&nbsp;&nbsp;&nbsp; }
	 */
	public static String UPLOAD_MEDIA_URL = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=%s&type=%s" ;
	
	/**
	 * 删除永久素材
	 * <br>方式：POST
	 * <br>参数：
	 * <br>&nbsp;&nbsp;&nbsp; access_token 全局唯一接口调用凭据
	 */
	public static String DELETE_MEDIA_URL = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=%s" ;
	
	/**
	 * 上传图文消息内的图片获取URL【订阅号与服务号认证后均可用】
	 * <br>方式：POST
	 * <br>参数：
	 * <br>&nbsp;&nbsp;&nbsp; access_token 全局唯一接口调用凭据
	 */
	public static String UPLOAD_NEWS_IMG_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=%s" ;
	
	
	/**
	 * 获取素材列表URL
	 * <br>方式：POST
	 * <br>参数：
	 * <br>&nbsp;&nbsp;&nbsp; access_token 全局唯一接口调用凭据
	 */
	public static String MATERIAL_LIST_URL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=%s" ;
	
	/**
	 * 获取素材列表
	 * @param type 素材的类型，图片（image）、视频（video）、语音 （voice）、图文（news）
	 * @param offset 从全部素材的该偏移位置开始返回，0表示从第一个素材 返回
	 * @param count 返回素材的数量，取值在1到20之间
	 * @return
	 */
	public static JSONObject getMaterialList(String type, int offset, int count) {
		
		Map<String, Object> params = new HashMap<String, Object>() ;
		params.put("type", type);
		params.put("offset", offset);
		params.put("count", count);
		
		String url = String.format(MATERIAL_LIST_URL, WeixinContext.getAccessToken()) ;
		JSONObject jsonObject = WeixinUtil.doPostJSON(url, params) ;
		logger.info("素材列表，类型：{}，偏移位置：{}，返回素材的数量：{}，本次返回素材量：{}，素材总数量：{}", type, offset, count, jsonObject.getString("item_count"), jsonObject.getString("total_count"));
		return jsonObject;
	}

	/**
	 * 上传素材
	 * @param mediaType
	 * @param file
	 * @return
	 */
	public static Media uploadMedia(MediaType mediaType, File file) {
		String url = String.format(UPLOAD_MEDIA_URL, WeixinContext.getAccessToken(), mediaType.name()) ;
		String httpRequest = WeixinUtil.httpRequest(url, file) ;
		logger.info("上传素材：{}", httpRequest);
		Object json = JSON.toJSON(httpRequest);
		return JSON.parseObject(json.toString(), Media.class);
	}
	
	/**
	 * 删除素材
	 * @param mediaId
	 * @return
	 */
	public static Media deleteMedia(String mediaId) {
		String url = String.format(DELETE_MEDIA_URL, WeixinContext.getAccessToken()) ;
		
		Map<String, String> params = new HashMap<String, String>() ;
		params.put("media_id", mediaId) ;
		Media media = WeixinUtil.doPost(url, params).asBean(Media.class);
		
		logger.info("上传素材：{}", JSON.toJSONString(media));
		return media ;
	}
	
	
	/**
	 * 上传图文消息内的图片
	 * @param file 本地文件
	 * @retur
	 */
	public static JSONObject uploadNewsImg(File file) {
		String url = String.format(UPLOAD_NEWS_IMG_URL, WeixinContext.getAccessToken()) ;
		String httpRequest = WeixinUtil.httpRequest(url, file) ;
		
		JSONObject parseObject = JSON.parseObject(httpRequest) ;
		logger.info("上传图文消息内的图片：{}", httpRequest);
		return parseObject;
	}
	
	
	/**
	 * 媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）
	 * @author yhaoquan
	 *
	 */
	public enum MediaType {
		image, voice, video, thumb
	}
}
